﻿Namespace SchoolClick.Controllers
    Public Class AlumnosController
        Inherits AuthorizeBaseController

        <ConstructSubMenu()> _
        <Authorize(Roles:="ALU")> _
        Function Index() As ActionResult
            Return View()
        End Function

#Region "METODOS PARA 'PERFIL DEL ALUMNO'"
        <ConstructSubMenu()> _
        <Authorize(Roles:="ERA")> _
        Public Function Perfil_Alumno(id As String) As ActionResult
            Return View()
        End Function

        <ConstructSubMenu()> _
       <Authorize(Roles:="PRF")> _
        Public Function PerfilAlumno_byP(id As String) As ActionResult
            Return View()
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA, PRF")> _
        <JFHandleExceptionMessageAttribute(Order:=1)> _
        Function _autocomplete_find_alumno(text As String) As JsonResult
            Dim db As New SchoolClickDAL,
                NIE As Integer,
                IsNumber = Integer.TryParse(text, NIE)

            If Not IsNumber Then
                Dim list = db.IAlumnos.Buscar(text.EncodeHTML).Take(80) _
                                        .Select(Function(a) New With {
                                                    .Text = Regex.Replace(a.ALUMNO, text, String.Format("<strong class=""j-highlight-autocomplete"">{0}</strong>", text), RegexOptions.IgnoreCase),
                                                    .Value = a.ID_ALUMNO,
                                                    .NIE = a.NIE,
                                                    .LastGrado = a.LAST_GRADO,
                                                    .UltimoAnio = a.ULTIMO_ANIO,
                                                    .IsNIE = IsNumber,
                                                    .Alumno = a.ALUMNO
                                                                     }).ToArray
                Return Json(New JFComboboxToJSON(list), JsonRequestBehavior.AllowGet)
            Else
                Dim list = db.IAlumnos.BuscarByNIE(text).Take(40) _
                                        .Select(Function(a) New With {
                                                    .Text = Regex.Replace(a.NIE, text, String.Format("<strong class=""j-highlight-autocomplete"">{0}</strong>", text), RegexOptions.IgnoreCase),
                                                    .Value = a.ID_ALUMNO,
                                                    .NIE = a.NIE,
                                                    .LastGrado = a.LAST_GRADO,
                                                    .UltimoAnio = a.ULTIMO_ANIO,
                                                    .IsNIE = IsNumber,
                                                    .Alumno = a.ALUMNO
                                            }).ToArray
                Return Json(New JFComboboxToJSON(list), JsonRequestBehavior.AllowGet)
            End If
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _get_perfil_alumno_administration(Alumno As String) As ActionResult
            Dim db As New SchoolClickDAL
            'Primero debemos de verificar si el alumno existe en el sistema
            If Not db.IAlumnos.Existe(Alumno.EncodeHTML) Then _
                Throw New ApplicationException("No se ha podido encontrar el alumno especificado en el sistema.")

            ViewBag.IsAlumno = False
            'Adjuntamos los responsables del alumno
            ViewBag.Responsables = db.IAlumnos.GetResponsables(Alumno.EncodeHTML)
            Return PartialView(db.IAlumnos.GetInfo(Alumno.EncodeHTML))
        End Function

        <HttpPost()> _
        <JFValidarModel()> _
        <Authorize(Roles:="ERA, ALU, PRF")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _save_changes_perfil_alumno(IDAlumno As String, model As V_INFO_ALUMNO) As JsonResult
            Dim db As New SchoolClickDAL

            If User.IsInRole("PRF") OrElse User.IsInRole("ERA") Then
                db.IAlumnos.Actualizar(IDAlumno, model.DUI, model.TELEFONO, model.CELULAR, model.CORREO_ELECTRONICO, model.DIRECCION_DE_CASA,
                                   model.MIEMBROS_FAMILIA, model.VALUE_TRABAJA, model.VALUE_TIENE_HIJOS, model.VALUE_VIVO_CON,
                                   model.ENFERM_PADECE, model.MEDICAMENTO_PERMANENTE, model.NIE, False)
            Else
                db.IAlumnos.Actualizar(IDAlumno, model.DUI, model.TELEFONO, model.CELULAR, model.CORREO_ELECTRONICO, model.DIRECCION_DE_CASA,
                                   model.MIEMBROS_FAMILIA, model.VALUE_TRABAJA, model.VALUE_TIENE_HIJOS, model.VALUE_VIVO_CON,
                                   model.ENFERM_PADECE, model.MEDICAMENTO_PERMANENTE, model.NIE, True)
            End If
            Return Json(New With {.success = True,
                                  .notify = New JFNotifySystemMessage("Los datos del alumno se actualizaron correctamente.",
                                                                       titulo:="¡Se actualizó correctamente!",
                                                                       permanente:=False,
                                                                       icono:=JFNotifySystemIcon.Update)})
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _retirar_alumno_instituto(IDAlumno As String) As JsonResult
            Dim db As New SchoolClickDAL
            db.IAlumnos.RetirarloInstituto(IDAlumno)
            Return Json(New With {.success = True,
                                  .notify = New JFNotifySystemMessage("El alumno se ha retirado completamente del instituto. También se le desactivo el usuario para ingresar a nuestro sistema.",
                                                                       titulo:="¡Se retiró correctamente!",
                                                                       permanente:=False,
                                                                       icono:=JFNotifySystemIcon.Update)})
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _cambiar_alumno_a_general(IDAlumno As String) As JsonResult
            Dim db As New SchoolClickDAL
            db.IAlumnos.CambioCarrera(IDAlumno.EncodeHTML)
            Return Json(New With {.success = True,
                                  .notify = New JFNotifySystemMessage("Este alumno se cambio satisfactoriamente a Bachillerato General. Este cambio se vera reflejado en el momento que asigne los alumnos a las secciones del nuevo Año Escolar.",
                                                                       titulo:="¡El alumno se cambió a Bachillerato General!",
                                                                       permanente:=False,
                                                                       icono:=JFNotifySystemIcon.Link)})
        End Function
#End Region

#Region "METODO PARA 'VER HISTORIAL DE NOTAS'"
        <ConstructSubMenu()> _
        <Authorize(Roles:="ERA")> _
        Public Function Historial_Notas_Alumnos(id As String) As ActionResult
            ViewBag.IDAlumno = id.EncodeHTML
            Return View()
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _get_historial_notas(Alumno As String) As ActionResult
            Dim db As New SchoolClickDAL
            'Primero debemos de verificar si el alumno existe en el sistema
            If Not db.IAlumnos.Existe(Alumno.EncodeHTML) Then _
                Throw New ApplicationException("No se ha podido encontrar el alumno especificado en el sistema.")

            'Adjuntamos los responsables del alumno
            ViewBag.IDAlumno = Alumno.EncodeHTML
            ViewBag.InfoAlumno = db.IAlumnos.GetInfo(Alumno)
            Return PartialView()
        End Function

        <HttpPost()> _
        <JFHandleExceptionMessageAttribute(Order:=1)> _
        Function _get_grados_del_alumno(Alumno As String) As JsonResult
            Dim db As New SchoolClickDAL

            'Recuperamos los grados disponibles para la matricula
            Dim list = db.IAlumnos.GetGradosInscritos(Alumno).OrderByDescending(Function(g) g.ANIO_ESCOLAR) _
                                        .Select(Function(gd) New SelectListItem With {.Text = String.Format("{0} ({1})", gd.TITULO, gd.ANIO_ESCOLAR),
                                                                                      .Value = gd.ID_GRADO
                                                                                     }).ToArray
            Return Json(New JFComboboxToJSON(list), JsonRequestBehavior.AllowGet)
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA, ALU")> _
        Public Function _resumen_gral_notas_alumno_admin(Grado As Integer, Alumno As String, request As JqGridRequest) As JsonResult
            Dim db As New SchoolClickDAL

            'Prevenimos la informacion de cualquier ataque con suplantacion de identidad para obtener las notas
            If User.IsInRole("ALU") Then _
                Alumno = User.Identity.Name

            'Preparamos los datos que vamos a enviar
            Dim datos As IEnumerable(Of NOTAS_ALUMNOS_ANIO_ESCOLAR) = db.IAlumnos.NotasAlumnosrResumen(Grado, Alumno) _
                                                                                 .Skip((request.PageIndex) * request.RecordsCount) _
                                                                                 .Take(request.RecordsCount),
                total = db.IAlumnos.NotasAlumnosrResumen(Grado, Alumno).Count,
                response As New JqGridResponse With {
                    .TotalPagesCount = Integer.Parse(Math.Ceiling(CDec(total) / CDec(request.RecordsCount))),
                    .PageIndex = request.PageIndex,
                    .TotalRecordsCount = total
                }

            'Preparamos la salida de los datos en formato del modelo del jqGrid
            response.Records.AddRange(datos.Select(Function(p) New JqGridRecord(Of jqGrid.NOTAS_PERIODOS_AE)(p.ID_MATERIA,
                                                                New jqGrid.NOTAS_PERIODOS_AE With {
                                                                        .MATERIA = p.MATERIA,
                                                                        .P1 = If(IsNothing(p.P1), String.Empty, p.P1),
                                                                        .P2 = If(IsNothing(p.P2), String.Empty, p.P2),
                                                                        .P3 = If(IsNothing(p.P3), String.Empty, p.P3),
                                                                        .P4 = If(IsNothing(p.P4), String.Empty, p.P4),
                                                                        .PROM = If(IsNothing(p.PROMEDIO), String.Empty, p.PROMEDIO),
                                                                        .NOTA_REPO = If(IsNothing(p.NOTA_REPO), String.Empty, p.NOTA_REPO),
                                                                        .PROM_REPO = If(IsNothing(p.PROM_REPO), String.Empty, p.PROM_REPO),
                                                                        .NOTA_REPO_XTRA = If(IsNothing(p.NOTA_EXTRA_REPO), String.Empty, p.NOTA_EXTRA_REPO),
                                                                        .PROM_FINAL = If(IsNothing(p.PROM_FINAL), String.Empty, p.PROM_FINAL)
                                                                    })))
            Return New JqGridJsonResult() With {.Data = response}
        End Function

        <HttpPost()> _
        <JFHandleExceptionMessageAttribute(Order:=1)> _
        Function _get_periodos_evaluativos_alumno(Alumno As String, IDGrado As Integer) As JsonResult
            Dim db As New SchoolClickDAL

            'Recuperamos los grados disponibles para la matricula
            Dim list = db.IAlumnos.GetPeriodosEvaluativos(IDGrado, Alumno.EncodeHTML) _
                            .Select(Function(p) New SelectListItem With {
                                        .Text = p.PERIODO,
                                        .Value = p.ID_PERIODO
                                    }).ToArray()
            Return Json(New JFComboboxToJSON(list), JsonRequestBehavior.AllowGet)
        End Function

        <HttpPost()> _
        <JFHandleExceptionMessageAttribute(Order:=1)> _
        Function _get_materias_alumno_bygrado(Alumno As String, IDGrado As Integer) As JsonResult
            Dim db As New SchoolClickDAL

            'Recuperamos los grados disponibles para la matricula
            Dim list = db.IAlumnos.GetMateriasCursaByGrado(IDGrado, Alumno.EncodeHTML) _
                            .Select(Function(p) New SelectListItem With {
                                        .Text = p.MATERIA,
                                        .Value = p.ID_MATERIA
                                    }).ToArray()
            Return Json(New JFComboboxToJSON(list), JsonRequestBehavior.AllowGet)
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA, ALU")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _get_notas_actividades_periodo_alumno_admin(Alumno As String, IDGrado As Integer, IDPeriodo As String, IDMateria As Integer) As ActionResult
            Dim db As New SchoolClickDAL

            'Prevenimos la informacion de cualquier ataque con suplantacion de identidad para obtener las notas
            If User.IsInRole("ALU") Then _
                Alumno = User.Identity.Name

            Return PartialView("_get_notas_actividades_periodo_alumno", db.IAlumnos.GetNotasActividadesByPeriodo(IDGrado, Alumno, IDPeriodo, IDMateria))
        End Function
#End Region

#Region "Metodos para 'INGRESO DE NOTAS PARA MATERIAS 2DA MATRICULA'"
        <ConstructSubMenu()> _
        <Authorize(Roles:="ERA")> _
        Function Notas_Materias_SM() As ActionResult
            Return View()
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ERA")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Function _get_ingreso_notas_materias_segunda() As ActionResult
            Dim db As New SchoolClickDAL

            'Obtenemos el STATUS del Año Escolar
            Dim statusAE = db.IAñoEscolar.GetStatusAñoEscolar

            'Verificamos si el Año Escolar esta abierto y existe un periodo activo
            If (Not statusAE.IS_CLOSE AndAlso Not IsNothing(statusAE.PERIODO_ACTIVO)) Then
                ViewBag.Año = statusAE.ANIO_ESCOLAR
                ViewBag.Periodo = String.Format("{0}-{1}", statusAE.PERIODO_ACTIVO, statusAE.ANIO_ESCOLAR)
                Return PartialView("_ingreso_notas_materias_segunda_matricula")
            End If

            ViewBag.Titulo = "No existe ningún Periodo Evaluativo activo en el sistema"
            ViewBag.Mensaje = "Lo sentimos, pero no se pueden ingresar las notas para las materias que los alumnos están cursando en segunda matrícula, ya que por el momento, no se encuentra activo ningún Periodo Evaluativo.<br /><br />Esto se puede deber a las siguientes causas:<br />- El Año Escolar ha finalizado.<br />- No se ha activado el Periodo Evaluativo correspondiente en el sistema. <br />- El Año Escolar se encuentra en el Periodo de Recuperación o Recuperación Extraordinario."
            Return PartialView("_error_page_for_year_custom")
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        Public Function _get_notas_alumnos_materia_sm(request As JqGridRequest) As JsonResult
            Dim db As New SchoolClickDAL
            Dim statusAE = db.IAñoEscolar.GetStatusAñoEscolar

            'Preparamos los datos que vamos a enviar
            Dim datos As IEnumerable(Of UDF_NOTAS_ALUMNOS_MATERIA_SM) = db.IAlumnos.GetNotasAlumnosWithMateriasSMByPeriodo(statusAE.ANIO_ESCOLAR, String.Format("{0}-{1}", statusAE.PERIODO_ACTIVO, statusAE.ANIO_ESCOLAR)) _
                                                                                 .Skip((request.PageIndex) * request.RecordsCount) _
                                                                                 .Take(request.RecordsCount),
                total = db.IAlumnos.GetNotasAlumnosWithMateriasSMByPeriodo(statusAE.ANIO_ESCOLAR, String.Format("{0}-{1}", statusAE.PERIODO_ACTIVO, statusAE.ANIO_ESCOLAR)).Count,
                response As New JqGridResponse With {
                    .TotalPagesCount = Integer.Parse(Math.Ceiling(CDec(total) / CDec(request.RecordsCount))),
                    .PageIndex = request.PageIndex,
            .TotalRecordsCount = total
                }

            'Preparamos la salida de los datos en formato del modelo del jqGrid
            response.Records.AddRange(datos.Select(Function(p) New JqGridRecord(Of jqGrid.NOTAS_MATERIAS_SEGUNDA_MATRICULA)(p.ID,
                                                                New jqGrid.NOTAS_MATERIAS_SEGUNDA_MATRICULA With {
                                                                        .Materia = p.MATERIA,
                                                                        .Alumno = p.NOMBRE_COMPLETO,
                                                                        .Grado = p.GRADO,
                                                                        .NIE = p.NIE,
                                                                        .Nota = p.NOTA_REAL
                                                                    })))
            Return New JqGridJsonResult() With {.Data = response}
        End Function

        <HttpPost()> _
        <Authorize(Roles:="ERA")> _
        Function _save_nota_periodo_materia_sm(id As String, Nota As Decimal) As JsonResult
            Dim db As New SchoolClickDAL
            Dim splitID As IEnumerable(Of String) = id.Split("-"c)
            Try
                db.IAlumnos.SaveNotaAlumnoMateriaSMByPeriodo(splitID(0), splitID(1), Nota)
                Return Json(True)
            Catch ex As Exception
                HttpContext.Response.StatusCode = 500
                HttpContext.Response.TrySkipIisCustomErrors = True
                Return Json(ex.Message)
            End Try
        End Function
#End Region



        <HttpGet()> _
        <Authorize(Roles:="ALU")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _get_perfil_alumno() As ActionResult
            Dim db As New SchoolClickDAL
            'Primero debemos de verificar si el alumno existe en el sistema
            If Not db.IAlumnos.Existe(User.Identity.Name) Then _
                Throw New ApplicationException("No se ha podido encontrar el alumno especificado en el sistema.")

            ViewBag.IsAlumno = True
            'Adjuntamos los responsables del alumno
            ViewBag.Responsables = db.IAlumnos.GetResponsables(User.Identity.Name)
            Return PartialView("_get_perfil_alumno_administration", db.IAlumnos.GetInfo(User.Identity.Name))
        End Function

        <HttpGet()> _
      <Authorize(Roles:="PRF")> _
      <JFHandleExceptionMessage(Order:=1)> _
        Public Function _get_perfil_alumnoPRF(Alumno As String) As ActionResult
            Dim db As New SchoolClickDAL
            'Primero debemos de verificar si el alumno existe en el sistema
            If Not db.IAlumnos.Existe(Alumno.EncodeHTML) Then _
                Throw New ApplicationException("No se ha podido encontrar el alumno especificado en el sistema.")

            ViewBag.IsAlumno = True
            'Adjuntamos los responsables del alumno
            ViewBag.Responsables = db.IAlumnos.GetResponsables(Alumno.EncodeHTML)
            Return PartialView("_get_perfil_alumno_administration", db.IAlumnos.GetInfo(Alumno.EncodeHTML))
        End Function

        <ConstructSubMenu()> _
        <Authorize(Roles:="ALU")> _
        Public Function Calificaciones() As ActionResult
            Return View()
        End Function

        <HttpGet()> _
        <Authorize(Roles:="ALU")> _
        <JFHandleExceptionMessage(Order:=1)> _
        Public Function _get_calificaciones() As ActionResult
            Dim db As New SchoolClickDAL
            'Primero debemos de verificar si el alumno existe en el sistema
            If Not db.IAlumnos.Existe(User.Identity.Name) Then _
                Throw New ApplicationException("No se ha podido encontrar el alumno especificado en el sistema.")

            'Adjuntamos los responsables del alumno
            ViewBag.IDAlumno = User.Identity.Name
            ViewBag.InfoAlumno = db.IAlumnos.GetInfo(User.Identity.Name)
            Return PartialView("_get_historial_notas")
        End Function
    End Class
End Namespace
